package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.PeriodoDeProgramaDAO;
import br.com.duosoftware.orcamento.entidades.PeriodoDePrograma;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class PeriodoDeProgramaBean implements Serializable {

    private PeriodoDePrograma periodoDePrograma;
    private PeriodoDeProgramaDAO periodoDeProgramaDAO;
    private List<PeriodoDePrograma> periodosDePrograma;

    public PeriodoDeProgramaBean() {

        periodoDeProgramaDAO = new PeriodoDeProgramaDAO();

    }

    public PeriodoDePrograma getPeriodoDePrograma() {
        return periodoDePrograma;
    }

    public void setPeriodoDePrograma(PeriodoDePrograma periodoDePrograma) {
        this.periodoDePrograma = periodoDePrograma;
    }

    public List<PeriodoDePrograma> getPeriodosDePrograma() {
        if (periodosDePrograma == null) {
            periodosDePrograma = periodoDeProgramaDAO.listarPeriodosDePrograma();
        }
        return periodosDePrograma;
    }

    public void setPeriodosDePrograma(List<PeriodoDePrograma> periodosDePrograma) {
        this.periodosDePrograma = periodosDePrograma;
    }

    /**
     * <b>Método que inicializa a periodoDePrograma a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        periodoDePrograma = new PeriodoDePrograma();

    }

    /**
     * <b>Método que adiciona ou edita uma PeriodoDePrograma</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        if (periodoDeProgramaDAO.verificarSeExiste(periodoDePrograma)) {

            Mensagens.mensagemDeErro("Período já cadastrado",
                                     "Um período com esses anos já está cadastrado");

        } else {

            periodoDeProgramaDAO.salvarOuAtualizar(periodoDePrograma);
            periodoDePrograma = new PeriodoDePrograma();
            periodosDePrograma = null;

        }

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPeriodoDePrograma.hide()");
        requestContext.update("formProgramaPeriodo:dtPeriodos");

    }

    /**
     * <b>Método para iniciar o processo de edição de um PeriodoDePrograma.</b>
     * <p>
     *
     * Ele verifica se há um PeriodoDePrograma selecionada para edição, se não
     * houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PeriodoDePrograma selecionado o médoto abre o dialog para
     * edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (periodoDePrograma == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgPeriodoDePrograma.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um
     * PeriodoDePrograma.</b> <p>
     *
     * Ele verifica se há uma PeriodoDePrograma selecionado para exclusão, se
     * não houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um PeriodoDePrograma selecionado o médoto abre um p:dialog para
     * confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (periodoDePrograma == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirPeriodoDePrograma.show()");
        }

    }

    /**
     * <b>Método para excluir um PeriodoDePrograma.</b> <p>
     *
     * Ele verifica se a PeriodoDePrograma selecionado para exclusão está sendo
     * utilizado por alguma outra tabela do banco. Se estiver uma mensagem de
     * aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            periodoDeProgramaDAO.excluir(periodoDePrograma);
            periodoDePrograma = new PeriodoDePrograma();
            periodosDePrograma = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirPeriodoDePrograma.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>
     *
     * O método instancia um novo objeto na variável PeriodoDePrograma para
     * limpar as infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        periodoDePrograma = new PeriodoDePrograma();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgPeriodoDePrograma.hide()");
        requestContext.update("formPeriodoDePrograma:dtPeriodosDePrograma");

    }
  
}
